19090
2161
Rakennan iOS-peliä. Jokainen pelihuone on rakennettu kahdesta käyttäjästä. Kun kaksi käyttäjää on löytänyt vastaavuuden, näytän "odottaa vastausta" -ajastinta molemmissa laitteissa: heidän on napsautettava "Olen valmis" -painiketta 8 sekunnin kuluessa, tai molemmat potkaistaan ​​huoneesta + poistetaan Firebasesta .
Käyttäjien oikea tila (ennen kuin kukin heistä napsauttaa "Olen valmis" -painiketta):
Vanhempi
Ottelut
Käyttäjä 1
vastustaja: Käyttäjä2
osoita: "NotReady"
Käyttäjä 2
vastustaja: Käyttäjä1
osoita: "NotReady"
Kriittinen huomautus - Ajastin molemmilla laitteilla aikaero on + -2 sekuntia, Toisin sanoen - kun laitteen ajastin päättyy ennen toista
Kun käyttäjä painaa "Olen valmis" -painiketta, päivitän tilaa: "userReady" ja tarkista, onko toinenkin käyttäjä valmis (tarkkailemalla sen tilan arvoa).
Jos molemmat käyttäjät ovat userReady - peli päällä.
ONGELMA
joten olemme jo selvittäneet, että 100 prosentissa tapauksista minulla on pieni aikaero molempien laitteiden välillä. MUTTA, jos esimerkiksi
Käyttäjä1 napsautti Olen valmis -painiketta. Joten nyt User2 sai ChildUpdate-tapahtuman, ja sikäli kuin hän tietää - User2 on täysin valmis pelaamaan.
User1-ajastin päättyy ensin (tosiasia), joten kun hänen ajastin päättyy, User2-ajastin pysyy 1 sekunnin ajan. NYT, User1-aika saavutti juuri nollan, joten hänet potkaistiin huoneesta ja lähetettiin RemoveValue-tapahtuma jokaiselle Käyttäjäsolmulle. Kun näin tapahtuu, tällä hyvin pienellä "aukolla" (User1-ajastimen nolla-ajan, User2-kellon näyttämisen 1 sekunti (tosiasia) välillä - ja hän painaa valmis-painiketta. Kuin hän ajattelee, että User1 on valmis pelaamaan, ja hän myös - kuin peli alkaa pelata.
Lopputulokset -
Molemmat pelaajat poistettiin Firebasesta
Käyttäjä1 on poissa huoneesta
User2 aloittaa pelin (ja luulee olevansa vastustaja)
Kuinka voin ratkaista tämän lopputuloksen? Olen jo yrittänyt kutsua startGame-toimintoa vasta, kun "UpdateChild-tila" on valmis, mutta se silti pääsee sisään, ehkä siksi, että updateChild- ja removeValue-tilaukset ovat?
Mitään ehdotuksia? Ja iso kiitos Firebase-tiimille siitä, että saavutit miten koko ajan !!! 
Ei ole järkevää, että käyttäjä 1 hyväksyy ja sitten vanhenee joka tapauksessa. Käyttäjän 2 pitäisi olla vanhentuva, jos aikaraja saavutetaan eikä hän ole vielä hyväksynyt.
Tämän estämiseksi etsit tapahtumia. Kun "vanhenet" käyttäjän, tee se tapahtuman avulla, jotta tietoristiriitoja ei ole.
var ref = uusi Firebase ("https: //  .firebaseio.com /");
ref.child ('Parent / Matches'). child (user1) .tranzaction (function (currentValue) {
if (currentValue && currentValue.state === 'NotReady') {
return null; // poista käyttäjä
}
muu {
paluu määrittelemätön; // keskeytä tapahtuma; tila muuttui, kun yritimme poistaa sitä
}
});
Mahdollisesti oikea nopeasti:
var ref = Firebase (URL: "https: //  .firebaseio.com / Vanhempi / Tulitikut /